package com.eian.boot.common.core.enums;

import lombok.Getter;

import java.util.Arrays;

/**
 * 全局通用枚举聚合类
 * 包含所有通用的、非业务特定的枚举定义
 * 通过注释划分不同的枚举区域
 *
 * @author alex.meng
 * @createTime 2025-10-14
 */
@Getter
public enum CommonEnum implements IBaseEnum<Integer> {

    // ========== 是否枚举 ==========
    // 标准值定义：0-否，1-是

    /**
     * 否
     */
    NO(0, "否", "是否"),

    /**
     * 是
     */
    YES(1, "是", "是否"),

    // ========== 状态枚举（启用/禁用） ==========
    // 标准值定义：0-禁用，1-启用

    /**
     * 禁用
     */
    DISABLED(0, "禁用", "状态"),

    /**
     * 启用
     */
    ENABLED(1, "启用", "状态"),

    // ========== 性别枚举（ISO/IEC 5218标准） ==========
    // 标准值定义：0-未知，1-男性，2-女性，9-不适用
    // @see <a href="https://en.wikipedia.org/wiki/ISO/IEC_5218">ISO/IEC 5218</a>

    /**
     * 性别-未知（Not known）
     */
    GENDER_UNKNOWN(0, "未知", "性别"),

    /**
     * 性别-男性（Male）
     */
    GENDER_MALE(1, "男", "性别"),

    /**
     * 性别-女性（Female）
     */
    GENDER_FEMALE(2, "女", "性别"),

    /**
     * 性别-不适用（Not applicable）
     */
    GENDER_NOT_APPLICABLE(9, "不适用", "性别"),

    // ========== 删除标识枚举 ==========
    // 标准值定义：0-未删除，1-已删除

    /**
     * 未删除（正常）
     */
    NOT_DELETED(0, "未删除", "删除标识"),

    /**
     * 已删除
     */
    DELETED(1, "已删除", "删除标识");

    /**
     * 枚举值（用于数据库存储）
     */
    private final Integer value;

    /**
     * 枚举标签（用于显示）
     */
    private final String label;

    /**
     * 枚举类型（用于区分不同类别的枚举）
     */
    private final String type;

    CommonEnum(Integer value, String label, String type) {
        this.value = value;
        this.label = label;
        this.type = type;
    }

    /**
     * 根据值获取枚举
     */
    public static CommonEnum getByValue(Integer value) {
        return IBaseEnum.getByValue(CommonEnum.class, value);
    }

    /**
     * 根据标签获取枚举
     */
    public static CommonEnum getByLabel(String label) {
        return IBaseEnum.getByLabel(CommonEnum.class, label);
    }

    /**
     * 根据值和类型获取枚举
     */
    public static CommonEnum getByValueAndType(Integer value, String type) {
        return Arrays.stream(values())
                .filter(e -> e.value.equals(value) && e.type.equals(type))
                .findFirst()
                .orElse(null);
    }

    /**
     * 根据标签和类型获取枚举
     */
    public static CommonEnum getByLabelAndType(String label, String type) {
        return Arrays.stream(values())
                .filter(e -> e.label.equals(label) && e.type.equals(type))
                .findFirst()
                .orElse(null);
    }

    /**
     * 获取指定类型的所有枚举
     */
    public static CommonEnum[] getByType(String type) {
        return Arrays.stream(values())
                .filter(e -> e.type.equals(type))
                .toArray(CommonEnum[]::new);
    }

    /**
     * 根据布尔值获取是否枚举
     */
    public static CommonEnum yesNoByBoolean(Boolean bool) {
        return Boolean.TRUE.equals(bool) ? YES : NO;
    }

    // ========== 便捷方法：是否类型 ==========

    /**
     * 根据布尔值获取状态枚举
     */
    public static CommonEnum statusByBoolean(Boolean bool) {
        return Boolean.TRUE.equals(bool) ? ENABLED : DISABLED;
    }

    /**
     * 根据布尔值获取删除标识枚举
     */
    public static CommonEnum deleteFlagByBoolean(Boolean deleted) {
        return Boolean.TRUE.equals(deleted) ? DELETED : NOT_DELETED;
    }

    // ========== 便捷方法：状态类型 ==========

    @Override
    public String getDescription() {
        return type + ":" + label;
    }

    /**
     * 转换为布尔值（适用于是否类型）
     */
    public Boolean toBoolean() {
        return YES.equals(this) || ENABLED.equals(this) || DELETED.equals(this);
    }

    // ========== 便捷方法：删除标识类型 ==========

    /**
     * 是否启用
     */
    public boolean isEnabled() {
        return ENABLED.equals(this);
    }

    /**
     * 是否已删除
     */
    public boolean isDeleted() {
        return DELETED.equals(this);
    }
}

